    /**
 * Created by Yang on 2014/8/30.
 */

var util = require('util');
var Handler = require('../Handler');
var wxConfig = require('../../config/wx');
var uuid = require('uuid');
var moment = require('moment');
var crypto = require('crypto');
function md5(text) {
    return crypto.createHash('md5').update(text).digest('hex');
};
function sha1(text) {
    return crypto.createHash('sha1').update(text).digest('hex');
};
//（ 1 ）发起微信支付请求

//TODO unix字符串
function newTimeStampStr(){
    /*   商户生成，从1970 年1 月1 日00：00：00 至
     今的秒数，即当前的时间，且最终需要转换为
     字符串形式；
     字符串类型，32个字节以下
     */
    var d = new Date();
    return d.getTime();

}

//TODO 商户生成的随机字符串,，32个字节以下
function newNonceStr(){
    return uuid.v1().replace(/-/g,'');
}

var getKeys = function(obj){
    var keys = [];
    for(var key in obj){
        keys.push(key);
    }
    return keys;
}

//TODO 生成package字符串  这个估计要放在后端做
function newPackageStr(ip){

    var keepOrderTime = 7;
    var nowTime = moment();
    var timeFormat = 'yyyyMMddHHmmss';
    var timeStart = nowTime.format(timeFormat);
    var timeExpire = nowTime.add(moment.duration(keepOrderTime,'d')).format(timeFormat);

    var package = {
        bank_type:'WX',
        body:'商品描述,128 字节以下',//商品描述,128 字节以下
        attach:'附加数据 128 字节以下，微信原样返回',//附加数据 128 字节以下,，原样返回
        partner:wxConfig.partnerId,//商户号,注册时分配的财付通商户号partnerId；
        out_trade_no:'001',//商户订单号,32 字节以下,32 个字符内、可包含字母；确保在商户系统唯一
        total_fee:'0.1',//订单总金额,单位为分； transport_fee + product_fee=total_fee；
        fee_type:'1',//支付币种,取值：1（人民币），暂只支持1；
        notify_url:'http://wx.tuuzii.com/wx/pay_callback',//在支付完成后，接收微信通知支付结果的URL，需给绝路径， 255 字符内, 格式如:http://wap.tenpay.com/tenpay.asp；
        spbill_create_ip:ip,//指用户浏览器端IP，不是商户服务器IP，格式为IPV4；
        time_start:timeStart,//订单生成时间，格式为yyyyMMddHHmmss
        time_expire:timeExpire,//订单失效时间，格式为yyyyMMddHHmmss
        transport_fee:'0.05',//物流费用,transport_fee + product_fee=total_fee；
        product_fee:'0.05',//商品费用,transport_fee + product_fee=total_fee；
        goods_tag:'',//商品标记 ，优惠券时可能用到；
        input_charset:'UTF-8'//取值范围："GBK"、"UTF-8"，默认："GBK"
    }

    /*
    加密过程：a
    * 对所有传入参数按照字段名的 ASCII 码从小到大排序（字典序）后，使用 URL 键值
     对的格式（即 key1=value1&key2=value2…）拼接成字符串 string1，注意：值为空的参数不
     参与签名；
    * */
    var keys = getKeys(package);
    var sortKeys = keys.sort();
    var string1 = '';
    for(var i in sortKeys){
        var key = sortKeys[i];
        if(package[key]){
            string1 = string1 + key + '=' + package[key] + "&";
        }
    }

    /*
    * 加密过程：b
    *在 string1 最 后 拼 接 上 key=paternerKey 得 到 stringSignTemp 字 符 串 ， 并 对
     stringSignTemp 进行 md5 运算，再将得到的字符串所有字符转换为大写，得到 sign 值
     signValue。
    * */
    var stringSignTemp = string1 + 'key=' + wxConfig.partnerKey;
    stringSignTemp = 'bank_type=WX&body=支付测试&fee_type=1&input_charset=UTF-8&notify_url=http://weixin.qq.com&out_trade_no=7240b65810859cbf2a8d9f76a638c0a3&partner=1900000109&spbill_create_ip=196.168.1.1&total_fee=1&key=8934e7d15453e97507ef794cf7b0519d';
    var signValue = md5(stringSignTemp).toUpperCase();


    /*
    * 加密过程：c
    *对传入参数中所有键值对的 value 进行 urlencode 转码后重新拼接成字符串 string2。
     对于 JS 前端程序，一定要使用函数 encodeURIComponent 进行 urlencode 编码（注意！进行
     urlencode时要将空格转化为%20而不是+）。
    * */
    var string2 = '';
    for(var key in package){
         if(package[key]){
            string2 = string2 + key + '=' + encodeURIComponent(package[key]) + "&";
        }
    }


    /*
    * 加密过程：d
    * 将 sign=signValue拼接到string2后面得到最终的 package 字符串。
    * */
    var finalPackageStr = string2 + 'sign=' + signValue;

    return finalPackageStr;
}

//TODO
function newPaySignStr(timestamp, noncestr,package){

    //可在此处对签名做校验
    // http://mp.weixin.qq.com/debug/cgi-bin/readtmpl?t=pay/index

    var paySign = {
        appid:wxConfig.appId,
        timestamp:timestamp,
        noncestr:noncestr,
        package:package,
        appkey:wxConfig.paySignKey//即paySignkey
    }

    /*
     *
     * a.对所有待签名参数按照字段名的 ASCII码从小到大排序（字典序）后，使用 URL 键
     值对的格式（即key1=value1&key2=value2…）拼接成字符串string1。这里需要注意的是所
     微信公众号支付接口文档V2.7
     有参数名均为小写字符，例如 appId 在排序后字符串则为 appid；
     */
    var keys = getKeys(paySign);
    var sortKeys = keys.sort();
    var string1 = '';
    for(var i in sortKeys){
        var key = sortKeys[i];
        if(package[key]){
            string1 = string1 + key + '=' + package[key] + "&";
        }
    }

    string1 = string1.substring(0,string1.length - 1);
    /*
     b.对 string1 作签名算法，字段名和字段值都采用原始值（此时package的value就对应
     了使用 2.6中描述的方式生成的 package），不进行 URL 转义。具体签名算法为 paySign =
     SHA1(string)。
     * */
     var paySign = sha1(string1);
     return paySign;
 }


//（2）用户成功支付点击完成按钮后，商户的前端会收到JavaScript 的返回值。商户可 直接跳转到支付成功的静态页面进行展示。


/*
 微信5.0版才有支付功能
 * 可以通过user agent 可获取如下微信版本示例信息：
 "Mozilla/5.0(iphone;CPU iphone OS 5_1_1 like Mac OS X) AppleWebKit/534.46(KHTML,like
 Geocko) Mobile/9B206 MicroMessenger/5.0"
 其中5.0 为用户安装的微信版本号，商户可以判定版本号是否高于或者等于5.0。
 * */


/*
 显示微信安全支付标题
 * 显示支付安全标题，需将原始链接添加上"showwxpaytitle=1"的尾串。通过这种方式，
 商户的页面将出现微信安全支付的标识。例如，原始URL 为：htp://weixin.qq.com,显示安全
 支付标题的URL 为：htp://weixin.qq.com?showwxpaytitle=1。
 * */

var WebPayHandler = function(req,res){
    Handler.call(this);
    this.req = req;
    this.res = res;
};
util.inherits(WebPayHandler,Handler);

WebPayHandler.prototype._getOptions = function(){
    var req = this.req, res = this.res;
    //生成options TODO
    var ip = req.headers['x-forwarded-for'] || req.connection.remoteAddress;
    var options = {
        appId:wxConfig.appId,
        timeStamp:newTimeStampStr(),
        nonceStr:newNonceStr(),//商户生成的随机字符串；
        package:newPackageStr(ip),//订单详情
        signType:'SHA1',
        paySign:''
    }

    options.paySign = newPaySignStr(options.timeStamp,options.nonceStr,options.package);
    res.json(options);
}

WebPayHandler.getOptions = function(req,res){
    var handler = new WebPayHandler(req,res);
    handler._getOptions();
}

module.exports = WebPayHandler;